package manager.modulo.ordemservico.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.auxiliares.MensagemExcessao;
import manager.interfaces.InterfaceDao;
import manager.principal.fonte.JanelaLogin;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class ProcedimentoDao implements InterfaceDao {

    private int id;
    private String nome;
    private Time prazo;
    private String descricao;
    private int valor;

    /**
     * Inicializando as variáveis
     */
    public ProcedimentoDao() {
        id = 0;
        nome = "";
        prazo = new Time(0, 0, 0);
        descricao = "";
        valor = 0;
    }

    /**
     * Buscar o id de um procedimento pelo nome
     *
     * @param nome
     * @return Retorno o id do procedimento encontrado, caso contrário retorna 0
     * quando não o encontra
     */
    public static int buscarIdProcedimentoPorNome(String nome) {
        try {

            String sql = "SELECT id FROM procedimento WHERE tx_nome = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, nome);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idPartner = 0;
            if (resultSet.first()) {
                idPartner = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idPartner;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Procedimentos");
            return 0;
        }
    }

    public LinkedList<String> buscar(String opcao, String buscado, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!buscado.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Nome do Procedimento")) {
                sql = "SELECT tx_nome FROM procedimento WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                buscado += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, buscado);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscaTabela(String opcao, String buscado) throws SQLException {
        LinkedList result = new LinkedList();
        if (!buscado.equals("")) {
            String sql = "";
            if (opcao.equalsIgnoreCase("Nome do Procedimento")) {
                sql = "SELECT"
                        + "  p.id AS Id,"
                        + "  p.tx_nome AS Nome,"
                        + "  p.nu_valor AS Valor"
                        + " FROM"
                        + "  procedimento p"
                        + " WHERE"
                        + "  p.tx_nome LIKE ? ";
                buscado += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, buscado);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> nome = new LinkedList<String>();
                LinkedList<String> valor = new LinkedList<String>();
                LinkedList<Integer> columnId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    columnId.add(resultSet.getInt("Id"));
                    nome.add(resultSet.getString("Nome"));
                    valor.add(Format.formatarMonetario(Double.toString(resultSet.getDouble("Valor") / 100)));
                }

                result.add(columnId);
                result.add(Format.getBooleanLinkedList(columnId.size()));
                result.add(nome);
                result.add(valor);
                result.add(Format.getBooleanLinkedList(columnId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto procedimento a partir de um id
     *
     * @param id Id do procedimento buscada
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM procedimento WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                nome = resultSet.getString("tx_nome");
                prazo = resultSet.getTime("tm_prazo");
                descricao = resultSet.getString("tx_descricao");
                valor = resultSet.getInt("nu_valor");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Procedimentos");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO procedimento (tx_nome,tm_prazo,tx_descricao,nu_valor) VALUES (?,?,?,?)";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, nome);
        preparedStatement.setTime(2, prazo);
        preparedStatement.setString(3, descricao);
        preparedStatement.setInt(4, valor);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE procedimento SET  tx_nome = ? , tm_prazo = ? , tx_descricao = ? , nu_valor = ? WHERE id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, nome);
        preparedStatement.setTime(2, prazo);
        preparedStatement.setString(3, descricao);
        preparedStatement.setInt(4, valor);
        preparedStatement.setInt(5, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Time getPrazo() {
        return prazo;
    }

    public void setPrazo(Time prazo) {
        this.prazo = prazo;
    }

    public int getValor() {
        return valor;
    }

    public void setValor(int valor) {
        this.valor = valor;
    }
}
